package main

import (
	"encoding/csv"
	"flag"
	"fmt"
	"io"
	"os"
	"strconv"
	"strings"

	"github.com/xuri/excelize"
)

var lastPath string
var dataPath string

// 初始化
func init() {
	flag.StringVar(&lastPath, "last", "", "a template excel file path, must be lastdate, eg. ./lastdate.xlsx")
	flag.StringVar(&dataPath, "data", "", "csv data file")
}

// main 入口函数
func main() {
	// 参数解析
	// -out=./excel_out.xlsx -data=./data.csv
	flag.Parse()

	// 非空检查，为了在不输入任何参数时，提示用户
	// 注：这种情况，flag 默认不输出 usage
	if strings.EqualFold("", lastPath) &&
		strings.EqualFold("", dataPath) {
		flag.Usage()
		return
	}

	// 打开输入文件
	csvfile, err := os.Open(dataPath)
	if err != nil {
		fmt.Println(err)
		os.Exit(1)
	}
	defer csvfile.Close()

	// 打开输出文件
	xlsx, errx := excelize.OpenFile(lastPath)
	if errx != nil {
		fmt.Println(errx)
		os.Exit(1)
	}

	// 导入csv
	reader := csv.NewReader(csvfile)
	fmt.Println("开始导入数据 " + dataPath)
	cnt := 0
	for {
		// 读取一个值
		record, err := reader.Read()
		// 如果读到文件的结尾，EOF的优先级居然比nil还高！
		if err == io.EOF {
			break
		} else if err != nil {
			fmt.Println("错误:", err)
			return
		}

		// 写入excel
		index := xlsx.GetSheetIndex(record[0])
		sheetIndex := "sheet" + strconv.Itoa(index)
		col := record[1]

		// 兼容上一版本
		if len(record) == 4 {
			// 按类型导入
			if strings.EqualFold("int", record[3]) {
				value, err := strconv.Atoi(record[2])
				if err == nil {
					xlsx.SetCellValue(sheetIndex, col, value)
				} else {
					fmt.Println(record)
					xlsx.SetCellValue(sheetIndex, col, record[2])
				}
			} else if strings.EqualFold("double", record[3]) {
				value, err := strconv.ParseFloat(record[2], 64)
				if err == nil {
					xlsx.SetCellValue(sheetIndex, col, value)
				} else {
					fmt.Println(record)
					xlsx.SetCellValue(sheetIndex, col, record[2])
				}
			} else {
				// string
				xlsx.SetCellValue(sheetIndex, col, record[2])
			}
		} else {
			xlsx.SetCellValue(sheetIndex, col, record[2])
		}

		fmt.Print(".")
		cnt++
	}
	fmt.Println()
	fmt.Println("导入数据完成 " + strconv.Itoa(cnt) + "条")

	// 更新公式计算
	xlsx.UpdateLinkedValue()

	// 输出
	errs := xlsx.Save()
	if errs != nil {
		fmt.Println(errs)
		os.Exit(1)
	}
}
